{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 单层感知器\n",
    "\n",
    "感知机是一种线性分类模型，其中单层感知器可以实现基本逻辑运算与、或、非，而多层感知器则可以实现异或运算。\n",
    "\n",
    "## 1、与、或逻辑"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "logical and\n",
      "epoch 0 sample 0  [1 2 0 0 0 0 0]\n",
      "epoch 0 sample 1  [1 2 0 1 -1 0 -1]\n",
      "epoch 0 sample 2  [0 2 -1 1 0 -1 -1]\n",
      "epoch 0 sample 3  [0 1 -2 0 1 1 1]\n",
      "epoch 1 sample 0  [1 2 -1 0 0 0 0]\n",
      "epoch 1 sample 1  [1 2 -1 0 0 0 0]\n",
      "epoch 1 sample 2  [1 2 -1 1 0 -1 -1]\n",
      "epoch 1 sample 3  [1 1 -2 0 1 1 1]\n",
      "epoch 2 sample 0  [2 2 -1 0 0 0 0]\n",
      "epoch 2 sample 1  [2 2 -1 1 -1 0 -1]\n",
      "epoch 2 sample 2  [1 2 -2 0 0 0 0]\n",
      "epoch 2 sample 3  [1 2 -2 1 0 0 0]\n",
      "epoch 3 sample 0  [1 2 -2 0 0 0 0]\n",
      "epoch 3 sample 1  [1 2 -2 0 0 0 0]\n",
      "epoch 3 sample 2  [1 2 -2 0 0 0 0]\n",
      "epoch 3 sample 3  [1 2 -2 1 0 0 0]\n",
      "epoch 4 sample 0  [1 2 -2 0 0 0 0]\n",
      "epoch 4 sample 1  [1 2 -2 0 0 0 0]\n",
      "epoch 4 sample 2  [1 2 -2 0 0 0 0]\n",
      "epoch 4 sample 3  [1 2 -2 1 0 0 0]\n",
      "epoch 5 sample 0  [1 2 -2 0 0 0 0]\n",
      "epoch 5 sample 1  [1 2 -2 0 0 0 0]\n",
      "epoch 5 sample 2  [1 2 -2 0 0 0 0]\n",
      "epoch 5 sample 3  [1 2 -2 1 0 0 0]\n",
      "epoch 6 sample 0  [1 2 -2 0 0 0 0]\n",
      "epoch 6 sample 1  [1 2 -2 0 0 0 0]\n",
      "epoch 6 sample 2  [1 2 -2 0 0 0 0]\n",
      "epoch 6 sample 3  [1 2 -2 1 0 0 0]\n",
      "epoch 7 sample 0  [1 2 -2 0 0 0 0]\n",
      "epoch 7 sample 1  [1 2 -2 0 0 0 0]\n",
      "epoch 7 sample 2  [1 2 -2 0 0 0 0]\n",
      "epoch 7 sample 3  [1 2 -2 1 0 0 0]\n",
      "epoch 8 sample 0  [1 2 -2 0 0 0 0]\n",
      "epoch 8 sample 1  [1 2 -2 0 0 0 0]\n",
      "epoch 8 sample 2  [1 2 -2 0 0 0 0]\n",
      "epoch 8 sample 3  [1 2 -2 1 0 0 0]\n",
      "epoch 9 sample 0  [1 2 -2 0 0 0 0]\n",
      "epoch 9 sample 1  [1 2 -2 0 0 0 0]\n",
      "epoch 9 sample 2  [1 2 -2 0 0 0 0]\n",
      "epoch 9 sample 3  [1 2 -2 1 0 0 0]\n",
      "\n",
      "logical or\n",
      "epoch 0 sample 0  [1 2 0 0 0 0 0]\n",
      "epoch 0 sample 1  [1 2 0 1 0 0 0]\n",
      "epoch 0 sample 2  [1 2 0 1 0 0 0]\n",
      "epoch 0 sample 3  [1 2 0 1 0 0 0]\n",
      "epoch 1 sample 0  [1 2 0 0 0 0 0]\n",
      "epoch 1 sample 1  [1 2 0 1 0 0 0]\n",
      "epoch 1 sample 2  [1 2 0 1 0 0 0]\n",
      "epoch 1 sample 3  [1 2 0 1 0 0 0]\n",
      "epoch 2 sample 0  [1 2 0 0 0 0 0]\n",
      "epoch 2 sample 1  [1 2 0 1 0 0 0]\n",
      "epoch 2 sample 2  [1 2 0 1 0 0 0]\n",
      "epoch 2 sample 3  [1 2 0 1 0 0 0]\n",
      "epoch 3 sample 0  [1 2 0 0 0 0 0]\n",
      "epoch 3 sample 1  [1 2 0 1 0 0 0]\n",
      "epoch 3 sample 2  [1 2 0 1 0 0 0]\n",
      "epoch 3 sample 3  [1 2 0 1 0 0 0]\n",
      "epoch 4 sample 0  [1 2 0 0 0 0 0]\n",
      "epoch 4 sample 1  [1 2 0 1 0 0 0]\n",
      "epoch 4 sample 2  [1 2 0 1 0 0 0]\n",
      "epoch 4 sample 3  [1 2 0 1 0 0 0]\n",
      "epoch 5 sample 0  [1 2 0 0 0 0 0]\n",
      "epoch 5 sample 1  [1 2 0 1 0 0 0]\n",
      "epoch 5 sample 2  [1 2 0 1 0 0 0]\n",
      "epoch 5 sample 3  [1 2 0 1 0 0 0]\n",
      "epoch 6 sample 0  [1 2 0 0 0 0 0]\n",
      "epoch 6 sample 1  [1 2 0 1 0 0 0]\n",
      "epoch 6 sample 2  [1 2 0 1 0 0 0]\n",
      "epoch 6 sample 3  [1 2 0 1 0 0 0]\n",
      "epoch 7 sample 0  [1 2 0 0 0 0 0]\n",
      "epoch 7 sample 1  [1 2 0 1 0 0 0]\n",
      "epoch 7 sample 2  [1 2 0 1 0 0 0]\n",
      "epoch 7 sample 3  [1 2 0 1 0 0 0]\n",
      "epoch 8 sample 0  [1 2 0 0 0 0 0]\n",
      "epoch 8 sample 1  [1 2 0 1 0 0 0]\n",
      "epoch 8 sample 2  [1 2 0 1 0 0 0]\n",
      "epoch 8 sample 3  [1 2 0 1 0 0 0]\n",
      "epoch 9 sample 0  [1 2 0 0 0 0 0]\n",
      "epoch 9 sample 1  [1 2 0 1 0 0 0]\n",
      "epoch 9 sample 2  [1 2 0 1 0 0 0]\n",
      "epoch 9 sample 3  [1 2 0 1 0 0 0]\n",
      "\n",
      "logical xor\n",
      "epoch 0 sample 0  [1 2 0 0 0 0 0]\n",
      "epoch 0 sample 1  [1 2 0 1 0 0 0]\n",
      "epoch 0 sample 2  [1 2 0 1 0 0 0]\n",
      "epoch 0 sample 3  [1 2 0 1 -1 -1 -1]\n",
      "epoch 1 sample 0  [0 1 -1 0 0 0 0]\n",
      "epoch 1 sample 1  [0 1 -1 0 1 0 1]\n",
      "epoch 1 sample 2  [1 1 0 1 0 0 0]\n",
      "epoch 1 sample 3  [1 1 0 1 -1 -1 -1]\n",
      "epoch 2 sample 0  [0 0 -1 0 0 0 0]\n",
      "epoch 2 sample 1  [0 0 -1 0 1 0 1]\n",
      "epoch 2 sample 2  [1 0 0 0 0 1 1]\n",
      "epoch 2 sample 3  [1 1 1 1 -1 -1 -1]\n",
      "epoch 3 sample 0  [0 0 0 0 0 0 0]\n",
      "epoch 3 sample 1  [0 0 0 0 1 0 1]\n",
      "epoch 3 sample 2  [1 0 1 1 0 0 0]\n",
      "epoch 3 sample 3  [1 0 1 1 -1 -1 -1]\n",
      "epoch 4 sample 0  [0 -1 0 0 0 0 0]\n",
      "epoch 4 sample 1  [0 -1 0 0 1 0 1]\n",
      "epoch 4 sample 2  [1 -1 1 0 0 1 1]\n",
      "epoch 4 sample 3  [1 0 2 1 -1 -1 -1]\n",
      "epoch 5 sample 0  [0 -1 1 1 0 0 -1]\n",
      "epoch 5 sample 1  [0 -1 0 0 1 0 1]\n",
      "epoch 5 sample 2  [1 -1 1 0 0 1 1]\n",
      "epoch 5 sample 3  [1 0 2 1 -1 -1 -1]\n",
      "epoch 6 sample 0  [0 -1 1 1 0 0 -1]\n",
      "epoch 6 sample 1  [0 -1 0 0 1 0 1]\n",
      "epoch 6 sample 2  [1 -1 1 0 0 1 1]\n",
      "epoch 6 sample 3  [1 0 2 1 -1 -1 -1]\n",
      "epoch 7 sample 0  [0 -1 1 1 0 0 -1]\n",
      "epoch 7 sample 1  [0 -1 0 0 1 0 1]\n",
      "epoch 7 sample 2  [1 -1 1 0 0 1 1]\n",
      "epoch 7 sample 3  [1 0 2 1 -1 -1 -1]\n",
      "epoch 8 sample 0  [0 -1 1 1 0 0 -1]\n",
      "epoch 8 sample 1  [0 -1 0 0 1 0 1]\n",
      "epoch 8 sample 2  [1 -1 1 0 0 1 1]\n",
      "epoch 8 sample 3  [1 0 2 1 -1 -1 -1]\n",
      "epoch 9 sample 0  [0 -1 1 1 0 0 -1]\n",
      "epoch 9 sample 1  [0 -1 0 0 1 0 1]\n",
      "epoch 9 sample 2  [1 -1 1 0 0 1 1]\n",
      "epoch 9 sample 3  [1 0 2 1 -1 -1 -1]\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# 逻辑与数据\n",
    "samples_and = [\n",
    "    [0, 0, 0],\n",
    "    [1, 0, 0],\n",
    "    [0, 1, 0],\n",
    "    [1, 1, 1],\n",
    "]\n",
    "\n",
    "# 逻辑或数据\n",
    "samples_or = [\n",
    "    [0, 0, 0],\n",
    "    [1, 0, 1],\n",
    "    [0, 1, 1],\n",
    "    [1, 1, 1],\n",
    "]\n",
    "\n",
    "# 逻辑异或数据\n",
    "samples_xor = [\n",
    "    [0, 0, 0],\n",
    "    [1, 0, 1],\n",
    "    [0, 1, 1],\n",
    "    [1, 1, 0],\n",
    "]\n",
    "\n",
    "# 定义感知器函数\n",
    "def perceptron(samples):\n",
    "    w = np.array([1, 2])  # 设置默认权重w1 =1，w2 =2\n",
    "    b = 0  # 设置默认偏置项bias =0\n",
    "    a = 1  # 学习率\n",
    "\n",
    "    for i in range(10):  # 迭代次数\n",
    "        for j in range(4):  # 数据条数\n",
    "            x = np.array(samples[j][:2])  # 取第j条数据的两个输入x1，x2\n",
    "            y = 1 if np.dot(w, x) + b > 0 else 0  # 向量w与x，点阵乘积>0，训练的输出y=1，否则y=0（模拟阶跃函数）\n",
    "            d = np.array(samples[j][2])  # 取出真值t，准备与y求残差\n",
    "\n",
    "            delta_b = a * (d - y)  # 梯度下降，delta收敛至0，得出w与b的解\n",
    "            delta_w = a * (d - y) * x\n",
    "\n",
    "            print('epoch {} sample {}  [{} {} {} {} {} {} {}]'.format(\n",
    "                i, j, w[0], w[1], b, y, delta_w[0], delta_w[1], delta_b\n",
    "            ))\n",
    "            \n",
    "            w = w + delta_w  # 更新权值与偏置项\n",
    "            b = b + delta_b\n",
    "\n",
    "# 主函数\n",
    "if __name__ == '__main__':\n",
    "    print('logical and')\n",
    "    perceptron(samples_and)\n",
    "    print('\\nlogical or')\n",
    "    perceptron(samples_or)\n",
    "    print('\\nlogical xor')\n",
    "    perceptron(samples_xor)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2、异或问题\n",
    "\n",
    "首先，在讨论单层感知器不能解决异或问题之前，先给出异或运算的真值表，及其运算关系表达式。\n",
    "\n",
    "| $$x_1$$ | $$x_2$$ | $$y$$ |\n",
    "| :-----: | :-----: | :---: |\n",
    "|    0    |    0    |   0   |\n",
    "|    1    |    0    |   1   |\n",
    "|    0    |    1    |   1   |\n",
    "|    1    |    1    |   0   |\n",
    "\n",
    "$$y = x_1 \\oplus  x_2$$\n",
    "\n",
    "如上所示，如果把真值表上 $x_1$ 和 $x_2$ 在直角坐标系中用y在对应位置表示出来，就会发现在异或问题上是找不到一条直线能把0、1两个点集分开的。也就是说，异或问题属于非线性问题，其是不能用一条直线分类。其实，不光感知机无法处理异或问题，所有的线性分类模型都无法处理异或问题。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "分割线函数：y1 = 2*x + 0.5\n",
      "分割线函数：y2 = -1.2*x + 1.5\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "xdata = np.linspace(-2, 5)\n",
    "print('分割线函数：y1 = 2*x + 0.5')\n",
    "plt.plot(xdata,xdata*2+0.5,'y')\n",
    "print('分割线函数：y2 = -1.2*x + 1.5')\n",
    "plt.plot(xdata,-xdata*1.2+1.5,'g')\n",
    "\n",
    "plt.plot([0,1], [0,1], 'bo')\n",
    "plt.plot([0,1], [1,0], 'ro')\n",
    "plt.axis([-2, 3, -2, 3])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "如图所示，把异或问题表现为点在二维平面上的分布问题，那么对于有两个输入的感知机而言，其就是在平面上画出一条线，由线把平面分割为两类。明显发现，对于单层感知器而言，是无法用一条直线区分红蓝两点集。"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
